home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / TGA320.ZIP / 320RTS.ASM < prev    next >
Encoding:
Assembly Source File  |  1996-12-05  |  19.1 KB  |  664 lines

  1.  
  2. ; Tiny 320x200x256 gfx library, C function calls
  3.  
  4. ; Note worx only with TASM 2.0 - 3.1 !!
  5.  
  6.         IDEAL
  7.         MODEL small
  8.         STACK  100h
  9.         CODESEG
  10.         LOCALS
  11.         P386
  12.  
  13. ; void putpixel(int x, int y, char col);
  14. ; void mode320(void);
  15. ; void modetext(void);
  16. ; char getpixel(int x, int y);
  17. ; void bline(int sx, int sy, int ex, int ey, char col);
  18. ; void blinedata(int sx, int sy, int ex, int ey, char far *data);
  19. ; void hline(int y, char col);
  20. ; void hlinedata(int y, char far *data);
  21. ; void vline(int x, char col);
  22. ; void vlinedata(int x, char far *data);
  23. ; void clr320(char col);
  24. ; void drawbitmap(int x, int y, int xlen, int ylen, char far *data);
  25. ; void getbitmap(int x, int y, int xlen, int ylen, char far *data);
  26. ; void wait4vrt(void);
  27. ; void putpalcol(int col, char red, char green, char blue);
  28. ; void getpolcol(int col, char far *red, char far *green, char far *blue);
  29. ; void getpal(int startcol, char far *pal);
  30. ; void putpal(int startcol, char far *pal);
  31. ; int  getoffset(int x, int y);
  32. ; void circle(int x, int y, int rad, char col);
  33. ; void fillbox(int x, int y, int xlen, int ylen, char col);
  34.  
  35. PUBLIC  putpixel
  36. PROC C  putpixel
  37.         ARG     x:WORD, y:WORD, c:BYTE
  38.         push    di
  39.         mov     ax,0a000h
  40.         mov     es,ax                       ;set es to VGA segment
  41.         mov     di,[x]
  42.         mov     dx,[y]
  43.         mov     ax,dx
  44.         shl     dx,8
  45.         shl     ax,6
  46.         add     ax,dx
  47.         add     di,ax
  48.         mov     al,[c]
  49.         stosb                               ;write pixel
  50.         pop     di
  51.         ret
  52. ENDP    putpixel
  53.  
  54. PUBLIC  mode320
  55. PROC C  mode320                          ;get into mode 13h
  56.         mov     ax,13h
  57.         int     10h
  58.         ret
  59. ENDP    mode320
  60.  
  61. PUBLIC  modetext
  62. PROC C  modetext                          ;get into mode 3 (text)
  63.         mov     ax,3
  64.         int     10h
  65.         ret
  66. ENDP    modetext
  67.  
  68. PUBLIC  getpixel
  69. PROC C  getpixel
  70.         ARG     x:WORD, y:WORD
  71.         push    si
  72.         mov     bx,ds
  73.         mov     ax,0a000h
  74.         mov     ds,ax                       ;set es to VGA seg
  75.         mov     si,[x]
  76.         mov     dx,[y]
  77.         mov     ax,dx
  78.         shl     ax,6
  79.         shl     dx,8
  80.         add     ax,dx
  81.         add     si,ax
  82.         lodsb
  83.         xor     ah,ah
  84.         mov     ds,bx
  85.         pop     si
  86.         ret
  87. ENDP    getpixel
  88.  
  89. PUBLIC  hline
  90. PROC C  hline
  91.         ARG     line:WORD,col:BYTE
  92.         mov     ax,0a000h
  93.         mov     es,ax                       ;set es to VGA seg
  94.         mov     dx,[line]
  95.         mov     ax,dx
  96.         shl     ax,6
  97.         shl     dx,8
  98.         add     ax,dx
  99.         mov     di,ax
  100.         mov     cx,160
  101.         mov     al,[col]
  102.         mov     ah,al
  103.         cld
  104.         rep     stosw                       ;fill line with col
  105.         ret
  106. ENDP    hline
  107. PUBLIC  vline
  108. PROC C  vline
  109.         ARG     row:WORD, c:BYTE
  110.         mov     ax,0a000h
  111.         mov     es,ax                       ;set es to VGA seg
  112.         mov     di,[row]                    ;set correct row
  113.         mov     al,[c]
  114.         mov     cx,200
  115.         cld
  116. @@Line:
  117.         stosb                               ;draw pixel
  118.         add     di,319                      ;just 319, since stosb incs di
  119.         dec     cx
  120.         cmp     cx,0
  121.         ja      SHORT @@Line
  122.         ret
  123. ENDP    vline
  124. PUBLIC  hlinedata
  125. PROC C  hlinedata
  126.         ARG     line:WORD, data:DWORD
  127.         push    ds
  128.         mov     ax,0a000h
  129.         mov     es,ax                       ;set es to VGA seg
  130.         mov     ax,[line]
  131.         mov     dx,ax
  132.         shl     ax,6
  133.         shl     dx,8
  134.         add     ax,dx
  135.         mov     di,ax
  136.         lds     si,[data]
  137.         mov     cx,160
  138.         cld
  139.         rep     movsw                       ;mov from ds:si to es:di
  140.         pop     ds
  141.         ret
  142. ENDP    hlinedata
  143. PUBLIC  vlinedata
  144. PROC C  vlinedata
  145.         ARG     row:WORD,data:DWORD
  146.         push    ds
  147.         mov     ax,0a000h
  148.         mov     es,ax
  149.         mov     di,[row]                    ;es:di -> x,y
  150.         lds     si,[data]                   ;ds:si -> bitmap
  151.         mov     cx,200
  152. @@Row:  movsb
  153.         add     di,319
  154.         dec     cx
  155.         cmp     cx,200
  156.         jb      SHORT @@Row
  157.         pop     ds
  158.         ret
  159. ENDP    vlinedata
  160. PUBLIC  clr320
  161. PROC C  clr320
  162.         ARG     col:BYTE
  163.         push    di
  164.         mov     ax,0a000h
  165.         mov     es,ax
  166.         mov     cx,16000
  167.         mov     al,[col]
  168.         mov     ah,al
  169.         push    ax
  170.         shl     eax,16
  171.         pop     ax
  172.         sub     di,di
  173.         cld
  174.         rep     stosd                       ;fill a000 with col
  175.         pop     di
  176.         ret
  177. ENDP    clr320
  178. PUBLIC  drawbitmap
  179. PROC C  drawbitmap
  180.         ARG     x:WORD, y:WORD, xlen:WORD, ylen:WORD, bitmap:DWORD
  181.         push    ds
  182.         push    di
  183.         mov     ax,0a000h
  184.         mov     es,ax                       ;set es to VGA seg
  185.         mov     di,[x]
  186.         mov     ax,[y]
  187.         mov     dx,ax
  188.         shl     ax,6
  189.         shl     dx,8
  190.         add     ax,dx
  191.         add     di,ax                       ;es:di -> x,y
  192.         mov     dx,[ylen]
  193.         lds     si,[bitmap]                 ;ds:si -> bitmap
  194.         mov     ax,[x]
  195.         add     ax,320
  196.         sub     ax,[xlen]
  197.         sub     ax,[x]                      ;find length between x+xlen and x+320
  198.         cld
  199. @@Draw:
  200.         mov     cx,[xlen]
  201.         rep     movsb                       ;move line
  202.         add     di,ax                       ;next line
  203.         dec     dx
  204.         cmp     dx,0
  205.         ja      SHORT @@Draw
  206.         pop     di
  207.         pop     ds
  208.         ret
  209. ENDP    drawbitmap
  210.  
  211. PUBLIC  getbitmap
  212. PROC C  getbitmap
  213.         ARG     x:WORD, y:WORD, xlen:WORD, ylen:WORD, bitmap:DWORD
  214.         push    ds
  215.         push    si
  216.         push    di
  217.         les     di,[bitmap]
  218.         mov     ax,ds
  219.         mov     es,ax                       ;es:di -> bitmap
  220.         mov     ax,0a000h
  221.         mov     ds,ax                       ;set es to VGA seg
  222.         mov     si,[x]
  223.         mov     ax,[y]
  224.         mov     dx,ax
  225.         shl     ax,6
  226.         shl     dx,8
  227.         add     ax,dx
  228.         add     si,ax                       ;ds:si -> x,y
  229.         mov     dx,[ylen]
  230.         mov     ax,[x]
  231.         add     ax,320
  232.         sub     ax,[xlen]
  233.         sub     ax,[x]                      ;find length between x+xlen & x+320
  234.         cld
  235. @@Draw:
  236.         mov     cx,[xlen]
  237.         rep     movsb                       ;move line
  238.         add     si,ax
  239.         dec     dx
  240.         cmp     dx,0
  241.         ja      SHORT @@Draw
  242.         pop     di
  243.         pop     si
  244.         pop     ds
  245.         ret
  246. ENDP    getbitmap
  247.  
  248. PUBLIC  wait4vrt
  249. PROC C  wait4vrt
  250.         mov     dx,3dah
  251. @@VRT:  in      al,dx                   ;Wait for VRT to start
  252.         test    al,8
  253.         jnz     @@VRT
  254. @@NoVRT:in      al,dx                   ;Wait for VRT to stop
  255.         test    al,8
  256.         jz      @@NoVRT
  257.         ret
  258. ENDP    wait4vrt
  259.  
  260. PUBLIC  putpalcol
  261. PROC C  putpalcol
  262.         ARG     colnum:BYTE, red:BYTE, green:BYTE, blue:BYTE
  263.         mov     dx,3c8h
  264.         mov     al,[colnum]
  265.         out     dx,al
  266.         inc     dx
  267.         mov     al,[red]
  268.         out     dx,al
  269.         mov     al,[green]
  270.         out     dx,al
  271.         mov     al,[blue]
  272.         out     dx,al
  273.         ret
  274. ENDP    putpalcol
  275.  
  276. PUBLIC    getpalcol
  277. PROC C  getpalcol
  278.         ARG     colnum:BYTE, red:DWORD, green:DWORD, blue:DWORD
  279.         mov     dx,3c8h
  280.         mov     al,[colnum]
  281.         out     dx,al
  282.         inc     dx
  283.         in      al,dx
  284.         mov     [BYTE PTR red],al
  285.         in      al,dx
  286.         mov     [BYTE PTR green],al
  287.         in      al,dx
  288.         mov     [BYTE PTR blue],al
  289.         ret
  290. ENDP    getpalcol
  291.  
  292. PUBLIC  getpal
  293. PROC C  getpal
  294.         ARG     colnum:BYTE, data:DWORD
  295.         mov     dx,3c8h
  296.         mov     al,[colnum]
  297.         out     dx,al
  298.         inc     dx
  299.         push    es
  300.         mov     ax,ds
  301.         mov     es,ax
  302.         les     di,[data]
  303.         mov     cx,768
  304.         sub     cl,[colnum]
  305.         rep     insb
  306.         ret
  307. ENDP    getpal
  308. PUBLIC  putpal
  309. PROC C  putpal
  310.         ARG     colnum:BYTE, data:DWORD
  311.         push    ds
  312.         push    si
  313.         mov     dx,3c8h
  314.         mov     al,[colnum]
  315.         out     dx,al
  316.         inc     dx
  317.         push    es
  318.         mov     ax,ds
  319.         mov     es,ax
  320.         lds     si,[data]
  321.         add     si,4
  322.         mov     cx,768
  323.         sub     cl,[colnum]
  324.         rep     outsb
  325.         pop     si
  326.         pop     ds
  327.         ret
  328. ENDP    putpal
  329.  
  330. PUBLIC  bline
  331. PROC C  bline
  332.         ARG     sx:WORD, sy:WORD, ex:WORD, ey:WORD, col:BYTE
  333.         LOCAL   deltax:WORD, deltay:WORD
  334.         push    di si
  335.  
  336.         mov     ax,0a000h
  337.         mov     es,ax                           ;es -> 0a000h VGA seg
  338.         mov     al,[col]
  339.         mov     gs,ax                           ;save col into GS
  340.  
  341.         mov     dx,[ex]
  342.         mov     cx,[ey]
  343.         sub     dx,[sx]                         ;d(elta)x = ex-sx
  344.         sub     cx,[sy]                         ;cx(deltay) =ey-sy
  345.  
  346.         cmp     dx,0
  347.         je      SHORT @@checky                  ;deltax is 0
  348.  
  349.         mov     bx,OFFSET cs:@@Xinc
  350.         js      SHORT @@decx                    ;deltax is negative
  351. @@incx:
  352.         ;inc     bl                             ;dx is horizontal to the right
  353.         mov     [WORD cs:bx],046FFh
  354.         mov     [BYTE cs:bx+02],04              ;set incx to inc [bp+04]
  355.         jmp     SHORT @@checky
  356. @@decx:
  357.         ;dec     bl
  358.         mov     [WORD cs:bx],04EFFh
  359.         mov     [BYTE cs:bx+02],04              ;set incx to dec [bp+04]
  360.         neg     dx
  361. @@checky:
  362.         cmp     cx,0
  363.         je      SHORT @@comealong
  364.         mov     bx,OFFSET @@Yinc
  365.         jns     SHORT @@incy                    ;CX is negative
  366.         jmp     SHORT @@decy
  367. @@incy:
  368.         ;inc     bh
  369.         mov     [WORD cs:bx],046FFh
  370.         mov     [BYTE cs:bx+02],06              ;set incy to inc [bp+06]
  371.         jmp     SHORT @@comealong
  372. @@decy:
  373.         ;dec     bh
  374.         mov     [WORD cs:bx],04EFFh
  375.         mov     [BYTE cs:bx+02],06              ;set incy to dec [bp+06]
  376.         neg     cx
  377. @@comealong:
  378. @@CheckDist:
  379.         mov     si,cx                           ;set distance to deltaY
  380.         cmp     dx,cx
  381.         jbe     SHORT @@disty                   ;
  382.         mov     si,dx                           ;no, correct to deltaX
  383. @@disty:
  384.         mov     [deltax],dx
  385.         mov     [deltay],cx
  386.         mov     cx,si                           ;loopcount
  387.         xor     bx,bx
  388.         xor     dx,dx
  389.  
  390. ;──────────────DrawLoop─────────────────────────────────────────────────
  391. @@DrawLoop:
  392.         add     bx,[deltax]                     ;xerr+=deltax
  393.         add     dx,[deltay]                     ;yerr+=deltay
  394.         cmp     bx,si                           ;if(xerr > distance)
  395.         jbe     SHORT @@ContinueX
  396.         sub     bx,si                           ;xerr-=distance
  397. @@Xinc: nop
  398.         nop
  399.         nop                                     ;here goes the inc/dec [bp+04]
  400. @@ContinueX:
  401. @@PastXSave:
  402.         cmp     dx,si                           ;if(yerr > distance)
  403.         jbe     SHORT @@ContinueY
  404.         sub     dx,si                           ;yerr-=distance
  405. @@Yinc: nop
  406.         nop
  407.         nop                                     ;here goes the inc/dec [bp+06]
  408. @@ContinueY:
  409.         mov     ax,[sy]
  410.         mov     di,ax
  411.         shl     ax,6
  412.         shl     di,8
  413.         add     di,ax
  414.         add     di,[sx]
  415.         mov     ax,gs                           ;put color in al
  416.         stosb                                   ;write pixel
  417.         dec     cx                              ;since add ax,[sx] will never
  418.         ja      SHORT @@DrawLoop                ; set carry flag (in 320x200)
  419. @@GoHome:
  420.         pop     si di
  421.         ret
  422. ENDP    bline
  423.  
  424. PUBLIC  blinedata
  425. PROC C  blinedata
  426.         ARG     sx:WORD, sy:WORD, ex:WORD, ey:WORD, data:DWORD
  427.         LOCAL   deltax:WORD, deltay:WORD, dist:WORD
  428.         push    di
  429.         push    si
  430.         push    ds
  431.         cld
  432.         lds     si,[data]
  433.         mov     ax,0a000h
  434.         mov     es,ax                       ;es -> 0a000h VGA seg
  435.         mov     dx,[ex]
  436.         mov     cx,[ey]
  437.         sub     dx,[sx]                     ;d(elta)x = ex-sx
  438.         sub     cx,[sy]                     ;cx(deltay) =ey-sy
  439. ;COMPUTE DIRECTION OF THE INCREMENT
  440.         cmp     dx,0
  441.         je      SHORT @@eqx                 ;deltax is 0
  442.         bt      dx,0fh
  443.         jc      SHORT @@decx                ;deltax is negative
  444. @@incx: mov     bl,1                        ;dx is horizontal to the right
  445.         jnc     SHORT @@checky              ;MODIFIED !!!!!!!
  446. @@decx: mov     bl,-1                       ;dx is horizontal to the left
  447.         jc      SHORT @@checky              ;MODIFIED !!!!!!
  448. @@eqx:  sub     bl,bl                       ;dx is vertical
  449. @@checky:
  450.         cmp     cx,0
  451.         je      SHORT @@eqy                 ;deltay is 0
  452.         bt      cx,0fh
  453.         jc      SHORT @@decy                ;deltay is negative
  454. @@incy: mov     bh,1                        ;cx is vertical downwards
  455.         jnc     SHORT @@comealong           ;MODIFIED !!!!!!!
  456. @@decy: mov     bh,-1                       ;cx is vertical upwards
  457.         jc      SHORT @@comealong           ;MODIFIED
  458. @@eqy:  sub     bh,bh                       ;cx is horizontal
  459. ;ABS BOTH DELTA VARIABLES
  460. @@comealong:
  461.         bt      dx,0fh
  462.         jnc     SHORT @@AbsY                ;if sign bit is on
  463.         neg     dx                          ; turn it off
  464. @@AbsY:
  465.         bt      cx,0fh
  466.         jnc     SHORT @@CheckDist
  467.         neg     cx
  468. @@CheckDist:
  469. ;CHECK WHICH DISTANCE IS GREATER
  470.         cmp     dx,cx
  471.         jbe     SHORT @@disty               ;disty is longer set dist to cx
  472.         mov     [dist],dx                   ;disx is longer, set distance to
  473.         jae     SHORT @@patsy               ; deltaX
  474. @@disty:
  475.         mov     [dist],cx                   ;set distance to deltaY
  476. @@patsy:
  477.         mov     [deltax],dx
  478.         mov     [deltay],cx
  479.         mov     cx,[dist]                   ;loopcount
  480.         xor     ax,ax
  481.         xor     dx,dx
  482. ;DRAW THE PIXELS
  483. @@DrawLoop:
  484.         add     ax,[deltax]                 ;xerr+=deltax
  485.         add     dx,[deltay]                 ;yerr+=deltay
  486.         cmp     ax,[dist]                   ;if(xerr > distance)
  487.         jbe     SHORT @@ContinueX
  488.         sub     ax,[dist]                   ;xerr-=distance
  489.         rol     eax,10h
  490.         mov     al,bl
  491.         cbw
  492.         add     [WORD sx],ax                ;sx+=incx
  493.         jmp     SHORT @@PastXSave
  494. @@ContinueX:
  495.         rol     eax,10h
  496. @@PastXSave:
  497.         cmp     dx,[dist]                   ;if(yerr > distance)
  498.         jbe     SHORT @@ContinueY
  499.         sub     dx,[dist]                   ;yerr-=distance
  500.         mov     al,bh
  501.         cbw
  502.         add     [WORD sy],ax                ;sy+=incy
  503. @@ContinueY:
  504.         mov     ax,[sy]
  505.         rol     edx,10h
  506.         mov     dx,ax
  507.         shl     ax,6
  508.         shl     dx,8
  509.         add     ax,dx
  510.         ror     edx,10h
  511.         add     ax,[sx]
  512.         mov     di,ax                       ;es:di -> pixel
  513.         mov     ax,cx
  514.         mov     cx,1
  515.         movsb                               ;write pixel
  516.         mov     cx,ax
  517.         ror     eax,16
  518.         dec     cx
  519.         cmp     cx,0
  520.         ja      SHORT @@DrawLoop
  521. @@GoHome:
  522.         pop     ds
  523.         pop     si
  524.         pop     di
  525.         ret
  526. ENDP    blinedata
  527.  
  528. PUBLIC  getoffset
  529. PROC C  getoffset
  530.         ARG     x:WORD, y:WORD
  531.         mov     ax,[y]
  532.         mov     dx,ax
  533.         shl     ax,6
  534.         shl     dx,8
  535.         add     ax,dx
  536.         add     ax,[x]
  537.         ret
  538. ENDP    getoffset
  539.  
  540. PUBLIC  fillbox
  541. PROC C  fillbox
  542.         ARG     x:WORD, y:WORD, xlen:WORD; ylen:WORD, col:BYTE
  543.         push    di si ds
  544.  
  545.         mov     di,[y]
  546.         mov     ax,di
  547.         shl     ax,6
  548.         shl     di,8
  549.         add     di,ax
  550.         add     di,[x]
  551.  
  552.         mov     bx,[ylen]
  553.         dec     bx
  554. @@looper:
  555.         mov     al,[col]
  556.         mov     cx,[xlen]
  557.         rep     stosb
  558.         dec     bx
  559.         jns     @@looper
  560.  
  561.         pop     ds si di
  562.         ret
  563. ENDP    fillbox
  564.  
  565. PUBLIC  bcircle
  566. PROC C  bcircle
  567.         ARG     cnx:WORD, cny:WORD, rad:WORD, col:BYTE
  568.         LOCAL   x:WORD, y:WORD, d:WORD,flag:BYTE
  569.         push    di
  570.         push    si
  571.  
  572.         mov     ax,0a000h
  573.         mov     es,ax
  574.  
  575.         mov     [flag],0
  576.  
  577.         mov     [d],3
  578.         mov     cx,[rad]
  579.         mov     bx,cx
  580.         shl     bx,1
  581.         sub     [d],bx                  ;d=3-(2*rad)
  582.         mov     bx,0                    ;x=0
  583. @@loop:
  584.         mov     ax,[cnx]                ;4
  585.         add     ax,bx                   ;7
  586.         mov     dx,[cny]                ;4
  587.         add     dx,cx                   ;7 = 22 clocks
  588.         call    _putpixel              ;centerx+x, centery+y
  589.  
  590.         mov     ax,[cnx]                ;4
  591.         add     ax,bx                  ;7
  592.         mov     dx,[cny]                ;4
  593.         sub     dx,cx                   ;7 = 22 clocks
  594.         call    _putpixel              ;centerx+x, centery-y
  595.  
  596.         mov     ax,[cnx]                ;4
  597.         sub     ax,bx                  ;7
  598.         mov     dx,[cny]                ;4
  599.         add     dx,cx                   ;7 = 22 clocks
  600.         call    _putpixel              ;centerx-x, centery+y
  601.  
  602.         mov     ax,[cnx]                ;4
  603.         sub     ax,bx                  ;7
  604.         mov     dx,[cny]                ;4
  605.         sub     dx,cx                   ;7 = 22 clocks
  606.         call    _putpixel              ;centerx-x, centery-y
  607.  
  608.         cmp     [flag],1
  609.         jae     @@C0
  610.  
  611.         inc     [flag]
  612.         xchg    bx,cx
  613.         jmp     @@loop                  ;draw other half
  614.  
  615. @@C0:                                   ;bx = x, cx = y
  616.         mov     [flag],0
  617.         xchg    bx,cx
  618.  
  619.         mov     si,bx
  620.  
  621.         cmp     [d],32768
  622.         jb      @@C1                    ;if(d<0)
  623.         shl     si,2
  624.         add     si,6
  625.         add     [d],si                  ;d=d+(4*x)+6
  626.         jmp     SHORT @@C2
  627.  
  628. @@C1:                                   ;else {
  629.         mov     si,bx
  630.         sub     si,cx                   ;x-y
  631.         jns        @@NoSign
  632.         neg     si
  633.         shl     si,2
  634.         neg     si                      ;*4
  635.         jmp        SHORT @@SignSet
  636. @@NoSign:
  637.         shl     si,2                    ;*4
  638. @@SignSet:
  639.         add     si,10
  640.         add     [d],si                  ;d=d+4*(x-y)+10
  641.         dec     cx                      ;y--
  642. @@C2:                                   ;}
  643.         inc     bx                      ;x++
  644.         cmp     bx,cx
  645.         jbe     @@loop                  ;while x!=y
  646.  
  647. @@C3:   pop     si
  648.         pop     di
  649.         ret
  650.  
  651. ; ax - x , dx - y
  652. PROC    _putpixel
  653.         mov     di,dx
  654.         shl     dx,8
  655.         shl     di,6
  656.         add     di,ax                   ;y coord
  657.         add     di,dx
  658.         mov     al,[col]
  659.         stosb
  660.         ret
  661. ENDP    _putpixel
  662. ENDP    bcircle
  663.         END
  664.